package algo;

/**
 * @author Ajie
 * @date 9/10/24
 * @function
 */

import java.util.LinkedList;

public class StepFilter {
    // 静态变量，用于保存滑动窗口内的步数数据
    private static LinkedList<Integer> window = new LinkedList<>();
    private static int windowSize = 5; // 滑动窗口大小

    // 静态方法，实时接收步数并进行过滤
    public static int filterStep(int newStep) {
        // 将新数据加入窗口
        window.add(newStep);
        if (window.size() > windowSize) {
            window.removeFirst(); // 如果窗口超出大小，移除最早的数据
        }

        for (int i = window.size() - 1; i >= 1; i--) {
            if (window.get(i -1 ) > window.get(i)) {
                // 如果前面的值大于后面的值，用后面的较小值替换前面的异常值
                window.set(i-1, window.get(i));
            }
        }

        // 返回最新过滤后的步数值
//        return window.getLast(); // 使用最新过滤后的步数
        return window.get(Math.max(Math.min(windowSize - 4, window.size() - 1), 0)); // 使用最新过滤后的步数
    }

    public static void main(String[] args) {
        // 测试实时步数过滤
        int[] steps = {1, 2, 3, 3, 3, 8, 8, 8, 4, 4, 5};

        // 逐个传入步数，并输出过滤后的结果
        for (int step : steps) {
            System.out.println("原始步数: " + step + " -> 过滤后步数: " + filterStep(step));
        }
    }
}